package hr.ctg.domain.model;

// Generated 2007.05.02 22:50:59 by Hibernate Tools 3.2.0.b9

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedNativeQueries;
import javax.persistence.NamedNativeQuery;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;
import org.hibernate.validator.NotNull;

/**
 * Mjesto generated by hbm2java
 */
@Entity
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
@Table(name = "mjesto")
@NamedQueries( {
		@NamedQuery(name = "Mjesto.findAll", query = "select m from Mjesto m"),
		@NamedQuery(name = "Mjesto.findByIdOtoka", query = "select m from Mjesto m JOIN m.otok o WHERE o.idOtoka = ? order by m.naziv"),
		@NamedQuery(name = "Mjesto.findByIdOtokaObjekti", query = "select distinct(o.mjesto) from Objekt o WHERE o.mjesto.otok.idOtoka = ?"),
		@NamedQuery(name = "Mjesto.findByIdZupanije", query = "select distinct m from Mjesto m JOIN m.zupanija z WHERE z.idZupanje = ? order by m.naziv"),
		@NamedQuery(name = "Mjesto.findCountByIdZupanije", query = "select count(m) from Mjesto m where m.zupanija.idZupanje = ?"),
		@NamedQuery(name = "Mjesto.findByIdZupanijeObjekti", query = "select distinct(m) from Mjesto m join m.objekts JOIN m.zupanija z WHERE z.idZupanje = ?"),
		@NamedQuery(name = "Mjesto.findByNazivOtokaLikeNaziv", query = "select m from Mjesto m JOIN m.otok o WHERE o.naziv = ?  and m.naziv like ?"),
		@NamedQuery(name = "Mjesto.findByIdZupanijeLikeNaziv", query = "select m from Mjesto m JOIN m.zupanija z WHERE z.idZupanje = ?  and m.naziv like ?"),
		@NamedQuery(name = "Mjesto.findByIdPoste", query = "select m from Mjesto m JOIN m.posta p WHERE p.idPoste = ?"),
		@NamedQuery(name = "Mjesto.findLikeNaziv", query = "select distinct(m) from Mjesto m where m.naziv like ?"),
		@NamedQuery(name = "Mjesto.findByObjektiLikeNaziv", query = "select distinct(m) from Mjesto m join m.objekts where m.naziv like ?"),
		@NamedQuery(name = "Mjesto.findByObjekti", query = "select distinct(o.mjesto) from Objekt o"),
		@NamedQuery(name = "Mjesto.findByNaziv", query = "select m from Mjesto m left join m.otok where m.naziv = ?"),
		@NamedQuery(name = "Mjesto.findTopByOcjena", query = "select dpo.mjesto from DojamPosjetitelja dpo group by dpo.mjesto order by avg(dpo.ocjena) desc"),
		@NamedQuery(name = "Mjesto.findTopByOcjenaIdTipaObjekta", query = "select m from Mjesto m join m.objekts o join o.dojamPosjetiteljas dpo where o.tipObjekta.idTipaObjekta = ? group by m order by avg(dpo.ocjena) desc"),
		@NamedQuery(name = "Mjesto.findFirstLetters", query = "SELECT DISTINCT SUBSTRING(m.naziv,1,1) FROM Mjesto m"),
		@NamedQuery(name = "Mjesto.findFirstLettersByObjekts", query = "SELECT DISTINCT SUBSTRING(m.naziv,1,1) FROM Mjesto m join m.objekts"),
		@NamedQuery(name = "Mjesto.findFirstLettersByObjOpObj", query = "SELECT DISTINCT SUBSTRING(m.naziv,1,1) FROM Mjesto m where ((select count(o) from Objekt o where o.mjesto = m) > 0 or (select count(o) from Objava o where o.mjesto = m) > 0 or (select count(o) from Opis o where o.mjesto = m) > 0)"),
		@NamedQuery(name = "Mjesto.findByFirstLetterObjekti", query = "SELECT distinct m FROM Mjesto m join m.objekts o where SUBSTRING(m.naziv,1,1) = ?"),
		@NamedQuery(name = "Mjesto.findByFirstLetterObjOpObj", query = "SELECT distinct m FROM Mjesto m where SUBSTRING(m.naziv,1,1) = ? and ((select count(o) from Objekt o where o.mjesto = m) > 0 or (select count(o) from Objava o where o.mjesto = m) > 0 or (select count(o) from Opis o where o.mjesto = m) > 0) order by m.naziv"),
		@NamedQuery(name = "Mjesto.findByFirstLetterObjOpObjJezik", query = "SELECT distinct m FROM Mjesto m where SUBSTRING(m.naziv,1,1) = ? and ((select count(o) from Objekt o where o.mjesto = m) > 0 or (select count(o) from Objava o where o.mjesto = m) > 0 or (select count(o) from Opis o join o.jezik j where j.oznaka = ? and o.mjesto = m) > 0) order by m.naziv"),
		@NamedQuery(name = "Mjesto.findCountByFirstLetterObjOpObjJezik", query = "SELECT distinct count(m) FROM Mjesto m where SUBSTRING(m.naziv,1,1) = ? and ((select count(o) from Objekt o where o.mjesto = m) > 0 or (select count(o) from Objava o where o.mjesto = m) > 0 or (select count(o) from Opis o join o.jezik j where j.oznaka = ? and o.mjesto = m) > 0)"),
		@NamedQuery(name = "Mjesto.findCountByFirstLetter", query = "SELECT count(m) FROM Mjesto m where SUBSTRING(m.naziv,1,1) = ?"),
		@NamedQuery(name = "Mjesto.findByOOOIdZupanije", query = "SELECT distinct m FROM Mjesto m where m.zupanija.idZupanje = ? and ((select count(o) from Objekt o where o.mjesto = m) > 0 or (select count(o) from Objava o where o.mjesto = m) > 0 or (select count(o) from Opis o where o.mjesto = m) > 0)"),
		@NamedQuery(name = "Mjesto.findByObjektiIdZupanije", query = "SELECT distinct o.mjesto FROM Objekt o where o.mjesto.zupanija.idZupanje = ? order by o.mjesto.naziv"),
		@NamedQuery(name = "Mjesto.findByOOOIdZupanijeJezik", query = "SELECT distinct m FROM Mjesto m where m.zupanija.idZupanje = ? and ((select count(o) from Objekt o where o.mjesto = m) > 0 or (select count(o) from Objava o where o.mjesto = m) > 0 or (select count(o) from Opis o join o.jezik j where o.mjesto = m and j.oznaka=?) > 0) order by m.naziv"),
		@NamedQuery(name = "Mjesto.findCountByOOOIdZupanijeJezik", query = "SELECT count(m) FROM Mjesto m where m.zupanija.idZupanje = ? and ((select count(o) from Objekt o where o.mjesto = m) > 0 or (select count(o) from Objava o where o.mjesto = m) > 0 or (select count(o) from Opis o join o.jezik j where o.mjesto = m and j.oznaka=?) > 0)"),
		@NamedQuery(name = "Mjesto.findByIdOtokaObjOpObj", query = "SELECT distinct m FROM Mjesto m where m.otok.idOtoka = ? and ((select count(o) from Objekt o where o.mjesto = m) > 0 or (select count(o) from Objava o where o.mjesto = m) > 0 or (select count(o) from Opis o where o.mjesto = m) > 0)"),
		@NamedQuery(name = "Mjesto.findByIdOtokaObjOpObjJezik", query = "SELECT distinct m FROM Mjesto m where m.otok.idOtoka = ? and ((select count(o) from Objekt o where o.mjesto = m) > 0 or (select count(o) from Objava o where o.mjesto = m) > 0 or (select count(o) from Opis o join o.jezik j where j.oznaka = ? and o.mjesto = m) > 0) order by m.naziv"),
		@NamedQuery(name = "Mjesto.findByFirstLetter", query = "SELECT distinct m FROM Mjesto m where SUBSTRING(m.naziv,1,1) = ? order by m.naziv"),
		@NamedQuery(name = "Mjesto.findTopByPosjetMjesta", query = "select m from Mjesto m join m.posjetMjestas p group by m order by sum(p.brojPosjeta) desc"),
		@NamedQuery(name = "Mjesto.findTopByPosjetMjestaPanormaioNotNull", query = "select m from Mjesto m join m.posjetMjestas p where m.panoramio is not null group by m order by sum(p.brojPosjeta) desc"),
		@NamedQuery(name = "Mjesto.findByPanormaioNotNull", query = "select m from Mjesto m where m.panoramio is not null"),
		@NamedQuery(name = "Mjesto.findTopByPosjetMjestaJezik", query = "select m from Mjesto m join m.posjetMjestas p join m.opisMjestas o where o.jezik.oznaka = ? group by m order by sum(p.brojPosjeta) desc"),
		@NamedQuery(name = "Mjesto.findTopByPosjetMjestaStartEndDate", query = "select m from Mjesto m join m.posjetMjestas p where p.datumPosjete between ? and ? group by m order by sum(p.brojPosjeta) desc"),
		@NamedQuery(name = "Mjesto.findTopByPosjetObjektaIdTipaObjekta", query = "select m from Mjesto m join m.objekts o join o.posjetObjektas p where o.tipObjekta.idTipaObjekta = ? group by m order by sum(p.brojPosjeta) desc"),
		@NamedQuery(name = "Mjesto.findTopByPosjetObjektaIdTipaObjektaStartEndDate", query = "select m from Mjesto m join m.objekts o join o.posjetObjektas p where o.tipObjekta.idTipaObjekta = ? and p.datumPosjete between ? and ? group by m order by sum(p.brojPosjeta) desc"),
		@NamedQuery(name = "Mjesto.findTopByOcjenaIdZupanije", query = "select m from Mjesto m join m.objekts o join o.dojamPosjetiteljas dpo where m.zupanija.idZupanje = ? group by m order by avg(dpo.ocjena) desc"),
		@NamedQuery(name = "Mjesto.findTopByOcjenaIdOtoka", query = "select m from Mjesto m join m.objekts o join o.dojamPosjetiteljas dpo where m.otok.idOtoka = ? group by m order by avg(dpo.ocjena) desc"),
		@NamedQuery(name = "Mjesto.findTopByPosjetMjestaIdZupanije", query = "select m from Mjesto m join m.posjetMjestas p where m.zupanija.idZupanje = ? group by m order by sum(p.brojPosjeta) desc"),
		@NamedQuery(name = "Mjesto.findTopByPosjetMjestaIdOtoka", query = "select m from Mjesto m join m.posjetMjestas p where m.otok.idOtoka = ? group by m order by sum(p.brojPosjeta) desc"),
		@NamedQuery(name = "Mjesto.findTopByOcjenaIdTipaObjektaIdZupanije", query = "select m from Mjesto m join m.objekts o join o.dojamPosjetiteljas dpo where m.zupanija.idZupanje = ? and o.tipObjekta.idTipaObjekta = ? group by m order by avg(dpo.ocjena) desc"),
		@NamedQuery(name = "Mjesto.findTopByPosjetObjektaIdTipaObjektaIdZupanije", query = "select m from Mjesto m join m.objekts o join o.posjetObjektas p where m.zupanija.idZupanje = ? and o.tipObjekta.idTipaObjekta = ? group by m order by sum(p.brojPosjeta) desc"),
		@NamedQuery(name = "Mjesto.findCountTopByOcjenaIdZupanije", query = "select count(m) from Mjesto m join m.objekts o join o.dojamPosjetiteljas dpo where m.zupanija.idZupanje = ?"),
		@NamedQuery(name = "Mjesto.findCountTopByPosjetMjestaIdZupanije", query = "select count(m) from Mjesto m join m.posjetMjestas p where m.zupanija.idZupanje = ?"),
		@NamedQuery(name = "Mjesto.findCountTopByOcjenaIdTipaObjektaIdZupanije", query = "select count(m) from Mjesto m join m.objekts o join o.dojamPosjetiteljas dpo where m.zupanija.idZupanje = ? and o.tipObjekta.idTipaObjekta = ?"),
		@NamedQuery(name = "Mjesto.findCountTopByPosjetObjektaIdTipaObjektaIdZupanije", query = "select count(m) from Mjesto m join m.objekts o join o.posjetObjektas p where m.zupanija.idZupanje = ? and o.tipObjekta.idTipaObjekta = ?"),
		@NamedQuery(name = "Mjesto.findByLatLonOpisNotNull", query = "select m from Mjesto m join m.opisMjestas o where m.longituda is not null and m.latituda is not null"),
		@NamedQuery(name = "Mjesto.findBrojPosjeta", query = "select sum(p.brojPosjeta) from Posjet p where p.mjesto.idMjesta = ?") })
@NamedNativeQueries(@NamedNativeQuery(name = "Mjesto.findNTopByPosjetMjesta", query = "select mjesto1_.id_mjesta, mjesto1_.grad, mjesto1_.latituda, mjesto1_.longituda, mjesto1_.naziv, mjesto1_.opis, mjesto1_.id_otoka, mjesto1_.panoramio, mjesto1_.id_poste, mjesto1_.www, mjesto1_.zoom, mjesto1_.id_zupanije from (SELECT posjetmjes1_.id_mjesta as id_mjesta, sum(posjetmjes1_.broj_posjeta) as suma FROM posjet posjetmjes1_ WHERE id_mjesta IS NOT NULL AND datum_posjete between ? and ? group by posjetmjes1_.id_mjesta order by sum(posjetmjes1_.broj_posjeta) desc limit 10) posjete, mjesto mjesto1_ where posjete.id_mjesta=mjesto1_.id_mjesta", resultClass = Mjesto.class))
public class Mjesto implements java.io.Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 3854111007570395881L;

	public static long getSerialVersionUID() {
		return serialVersionUID;
	}

	private int idMjesta;
	private Zupanija zupanija;
	private Posta posta;
	private Otok otok;
	private String naziv;
	private boolean grad;
	private Double longituda;
	private Double latituda;
	private Integer zoom;
	private String opis;
	private String www;
	private int brojSlika;
	private Set<Objekt> objekts = new HashSet<Objekt>(0);
	private Set<Adresa> adresas = new HashSet<Adresa>(0);
	private Set<Posjet> posjetMjestas = new HashSet<Posjet>(0);
	private Set<Opis> opisMjestas = new HashSet<Opis>(0);
	private Set<DojamPosjetitelja> dojamPosjetiteljas = new HashSet<DojamPosjetitelja>(
			0);
	private Set<DnevnikAktivnosti> dnevnikAktivnostis = new HashSet<DnevnikAktivnosti>(
			0);
	private Set<Slika> slikas = new HashSet<Slika>(0);
	private Set<Vrijeme> vrijemes = new HashSet<Vrijeme>(0);
	private Set<Prognoza> prognozas = new HashSet<Prognoza>(0);
	private Set<Objava> objavas = new HashSet<Objava>(0);
	private Integer brojPosjeta;
	private String panoramio;

	public Mjesto() {
	}

	public Mjesto(final int idMjesta) {
		this.idMjesta = idMjesta;
	}

	public Mjesto(final int idMjesta, final Zupanija zupanija,
			final Posta posta, final Otok otok, final String naziv,
			final boolean grad, final Set<Objekt> objekts,
			final Set<Adresa> adresas) {
		this.idMjesta = idMjesta;
		this.zupanija = zupanija;
		this.posta = posta;
		this.otok = otok;
		this.naziv = naziv;
		this.grad = grad;
		this.objekts = objekts;
		this.adresas = adresas;
	}

	public Mjesto(final int idMjesta, final Zupanija zupanija,
			final Posta posta, final String naziv, final boolean grad) {
		this.idMjesta = idMjesta;
		this.zupanija = zupanija;
		this.posta = posta;
		this.naziv = naziv;
		this.grad = grad;
	}

	@Override
	public boolean equals(final Object obj) {
		if (this == obj) {
			return true;
		}
		if (obj == null) {
			return false;
		}
		if (!(obj instanceof Mjesto)) {
			return false;
		}
		final Mjesto other = (Mjesto) obj;
		if (idMjesta != other.getIdMjesta()) {
			return false;
		}
		return true;
	}

	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "mjesto")
	public Set<Adresa> getAdresas() {
		return adresas;
	}

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "id_mjesta", unique = true, nullable = false)
	@NotNull
	public int getIdMjesta() {
		return idMjesta;
	}

	@Column(name = "latituda", nullable = false)
	@NotNull
	public Double getLatituda() {
		return latituda;
	}

	@Column(name = "longituda", nullable = false)
	@NotNull
	public Double getLongituda() {
		return longituda;
	}

	@Column(name = "naziv", nullable = false)
	@NotNull
	public String getNaziv() {
		return naziv;
	}

	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "mjesto")
	public Set<Objekt> getObjekts() {
		return objekts;
	}

	@Column(name = "opis")
	public String getOpis() {
		return opis;
	}

	@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_otoka")
	public Otok getOtok() {
		return otok;
	}

	@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_poste", nullable = false)
	@NotNull
	public Posta getPosta() {
		return posta;
	}

	@Column(name = "zoom", nullable = false)
	public Integer getZoom() {
		return zoom;
	}

	@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_zupanije", nullable = false)
	@NotNull
	public Zupanija getZupanija() {
		return zupanija;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + idMjesta;
		return result;
	}

	@Column(name = "grad", nullable = false)
	@NotNull
	public boolean isGrad() {
		return grad;
	}

	public void setAdresas(final Set<Adresa> adresas) {
		this.adresas = adresas;
	}

	public void setGrad(final boolean grad) {
		this.grad = grad;
	}

	public void setIdMjesta(final int idMjesta) {
		this.idMjesta = idMjesta;
	}

	public void setLatituda(final Double latituda) {
		this.latituda = latituda;
	}

	public void setLongituda(final Double longituda) {
		this.longituda = longituda;
	}

	public void setNaziv(final String naziv) {
		this.naziv = naziv;
	}

	public void setObjekts(final Set<Objekt> objekts) {
		this.objekts = objekts;
	}

	public void setObjavas(final Set<Objava> objavas) {
		this.objavas = objavas;
	}

	public void setOpis(final String opis) {
		this.opis = opis;
	}

	public void setOtok(final Otok otok) {
		this.otok = otok;
	}

	public void setPosta(final Posta posta) {
		this.posta = posta;
	}

	public void setZoom(final Integer zoom) {
		this.zoom = zoom;
	}

	public void setZupanija(final Zupanija zupanija) {
		this.zupanija = zupanija;
	}

	@Override
	public String toString() {
		return Integer.toString(idMjesta);
	}

	@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "mjesto")
	public Set<Posjet> getPosjetMjestas() {
		return posjetMjestas;
	}

	public void setPosjetMjestas(final Set<Posjet> posjetMjestas) {
		this.posjetMjestas = posjetMjestas;
	}

	@Column(name = "www")
	public String getWww() {
		return www;
	}

	public void setWww(final String www) {
		this.www = www;
	}

	@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "mjesto")
	public Set<Opis> getOpisMjestas() {
		return opisMjestas;
	}

	public void setOpisMjestas(final Set<Opis> opisMjestas) {
		this.opisMjestas = opisMjestas;
	}

	public Opis getOpis(final String currentLanguage) {
		if (opisMjestas != null) {
			for (final Opis opis : opisMjestas) {
				if (opis.getJezik().getOznaka().equals(currentLanguage)) {
					return opis;
				}
			}
		}
		return null;
	}

	@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "mjesto")
	public Set<DojamPosjetitelja> getDojamPosjetiteljas() {
		return dojamPosjetiteljas;
	}

	public void setDojamPosjetiteljas(
			final Set<DojamPosjetitelja> dojamPosjetiteljas) {
		this.dojamPosjetiteljas = dojamPosjetiteljas;
	}

	@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "mjesto")
	public Set<Slika> getSlikas() {
		return slikas;
	}

	public void setSlikas(final Set<Slika> slikas) {
		this.slikas = slikas;
	}

	@Transient
	public int getBrojSlika() {
		return brojSlika;
	}

	public void setBrojSlika(final int brojSlika) {
		this.brojSlika = brojSlika;
	}

	@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "objekt")
	public Set<DnevnikAktivnosti> getDnevnikAktivnostis() {
		return dnevnikAktivnostis;
	}

	public void setDnevnikAktivnostis(
			final Set<DnevnikAktivnosti> dnevnikAktivnostis) {
		this.dnevnikAktivnostis = dnevnikAktivnostis;
	}

	@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "mjesto")
	public Set<Vrijeme> getVrijemes() {
		return vrijemes;
	}

	public void setVrijemes(final Set<Vrijeme> vrijemes) {
		this.vrijemes = vrijemes;
	}

	@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "mjesto")
	public Set<Prognoza> getPrognozas() {
		return prognozas;
	}

	public void setPrognozas(final Set<Prognoza> prognozas) {
		this.prognozas = prognozas;
	}

	@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "mjesto")
	public Set<Objava> getObjavas() {
		return objavas;
	}

	// @Formula("(select sum(p.broj_posjeta) from posjet p where p.id_mjesta=id_mjesta)")
	@Transient
	public Integer getBrojPosjeta() {
		return brojPosjeta;
	}

	@Column(name = "panoramio")
	public String getPanoramio() {
		return panoramio;
	}

	public void setPanoramio(String panoramio) {
		this.panoramio = panoramio;
	}

	public void setBrojPosjeta(Integer brojPosjeta) {
		this.brojPosjeta = brojPosjeta;
	}
}
